<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Generator函数</title>
</head>
<body>
  <!--
   Generator函数
    概念：
      1、ES6提供的解决异步编程的方案之一
      2、Generator函数是一个状态机，内部封装了不同状态的数据，
      3、用来生成遍历器对象
      4、可暂停函数(惰性求值), yield可暂停，next方法可启动。每次返回的是yield后的表达式结果
    特点：
      1、function 与函数名之间有一个星号
      2、内部用yield表达式来定义不同的状态
      例如：
        function* generatorExample(){
          let result = yield 'hello';  // 状态值为hello
          yield 'generator'; // 状态值为generator
        }
      3、generator函数返回的是指针对象(接11章节里iterator)，而不会执行函数内部逻辑
      4、调用next方法函数内部逻辑开始执行，遇到yield表达式停止，返回{value: yield后的表达式结果/undefined, done: false/true}
      5、再次调用next方法会从上一次停止时的yield处开始，直到最后
      6、yield语句返回结果通常为undefined， 当调用next方法时传参内容会作为启动时yield语句的返回值。
  -->
<script type="text/javascript" src="./js/jquery-1.10.1.min.js"></script>
<script type="text/javascript">
			// function* generator(){
			// 	yield 'hi';
			// 	yield 'how are you?';
			// 	yield 'bye'
			// }
			// const gen=generator()
			// console.log(gen.next())//hi
			// console.log(gen.next())//how are you
			// console.log(gen.next())//bye
			
			// 使用生成器生成无限个值：
			// function* idGenerator(){
			// 	let i=0;
			// 	while(true){
			// 		yield i++;
			// 	}
			// }
			// const ids=idGenerator();
			// console.log(ids.next().value)
			// console.log(ids.next().value)
			// console.log(ids.next().value)
			// ...
			
			function* myGenerator(){
				 var result=yield 
				 yield result
				 return '返回的结果'
			}
			var mg=myGenerator();//返回的是指针对象
			console.log(mg.next());	//{value: undefined, done: false}
			console.log(mg.next('aaaaaaaa'));//传递参数//{value: "aaaaaaaa", done: false}
			console.log(mg.next());	//{value: "返回的结果", done: true}
			
			
			// 对象的Symbol.iterator属性,指向遍历器对象
			let obj={name:'kobe',age:40};
			obj[Symbol.iterator]=function* myTest(){
				yield 1
				yield 2
				yield 3
			}
			console.log(obj);//{name: "kobe", age: 40, Symbol(Symbol.iterator): ƒ}
			console.log([...obj]);//(3) [1, 2, 3]
			// for(let i of obj){
			// 	console.log(i);//1 2 3
			// }
			
			
			// 依次执行多个异步任务
			function* chef(){
				console.log('魏忠贤')
				yield 'worker';
				console.log('秦桧')
				yield 'worker';
			}
			function* worker(){
				console.log('岳飞')
				yield 'chef';
				console.log('海瑞')
				yield 'chef';
				console.log('包拯')
				yield 'chef';
			}
			const ch=chef();
			const wo=worker();
			// 流程控制
			function run(gen){
				const v=gen.next();
				console.log(v)
				if(v.value=='chef'){
					run(ch);
				}else if(v.value=='worker'){
					run(wo);
				}
			}
			run(wo);//开始执行
			// 我们来分析下代码，我们按照大厨和伙计的角色，分别创建了两个Generator函数，chef和worker。
			// 函数中列出了各自角色要干的活，当要转交给其他人任务时，利用yield，暂停执行，并将执行权交出；
			// run方法实现流程控制，根据yield返回的值，决定移交给哪个角色函数。相互配合，直到完成整个过程。
		
			
			
</script>


</body>
</html>